package algo3.tp1.ejercicios;

import java.util.LinkedList;

public class Ejercicio3 {
	private LinkedList<Movimiento> listaMovimientos;
	private boolean termine;

	private void backtrack(Juego juego) {		
		if (juego.contarFichas() == 1) {
			termine = true;
		} else {

			if (juego.fichasBlancas() == 0 || juego.fichasNegras() == 0) {
				return;
			}

			for (Posicion casilla : juego.casillas()) {
				if (juego.hayFicha(casilla)) {
					for (Direccion d : Direccion.values()) {

						if (juego.esCasilla(casilla.mover(d))
								&& juego.esCasilla(casilla.mover(d).mover(d))) {

							Posicion aSaltar = casilla.mover(d);
							Posicion aDondeSaltar = aSaltar.mover(d);

							if (juego.hayFicha(aSaltar)
									&& !juego.hayFicha(aDondeSaltar)) {

								juego.quitarFicha(aSaltar);
								juego.quitarFicha(casilla);
								juego.agregarFicha(aDondeSaltar);
								
								listaMovimientos.add(new Movimiento(casilla,
										aDondeSaltar));

								backtrack(juego);

								if (termine)
									return;

								listaMovimientos.removeLast();

								juego.agregarFicha(aSaltar);
								juego.agregarFicha(casilla);
								juego.quitarFicha(aDondeSaltar);

							}
						}
					}
				}
			}
		}
	}

	public LinkedList<Movimiento> resolver(Juego juego) {
		termine = false;
		listaMovimientos = new LinkedList<Movimiento>();

		backtrack(juego);
		return this.listaMovimientos;
	}
}